package com.rain.rainspringboot3.order.strategy;// AbstractOrderSaveTemplate.java

import com.rain.rainspringboot3.order.entity.Order;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public abstract class AbstractOrderSaveTemplate implements OrderSaveStrategy {

    // 模板方法：定义主流程骨架
    @Override
    public final void save(Order order) {
        // 公共校验
        validate(order);
        // 子类可扩展
        preProcess(order);
        // 子类必须实现的核心保存逻辑
        doSave(order);
        // 子类可扩展
        postProcess(order);
        log.info("订单保存完成，类型: {}", order.getType());
    }

    // 公共校验（所有类型都需校验）
    protected void validate(Order order) {
        if (order == null || order.getType() == null) {
            throw new IllegalArgumentException("订单或类型不能为空");
        }
        // 可扩展更多通用校验
    }

    // 预处理，子类可选重写
    protected void preProcess(Order order) {
        // 默认空实现
    }

    // 核心保存逻辑：强制子类实现
    protected abstract void doSave(Order order);

    // 后置处理：子类可选重写
    protected void postProcess(Order order) {
        // 默认空实现
    }
}